﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using DECOR.BL.BE;
using DECOR.BL.BC;
using System.Collections.Generic;


namespace DECOR.WebApp
{
    public partial class DocImprGrp : System.Web.UI.Page
    {
        public List<DetalleBE> lstDetalle = new List<DetalleBE>();

        protected void Page_Init(object sender, EventArgs e)
        {
            //this.validaLogin();
        }

        private void validaLogin()
        {
            //if (Session["UsuarioWeb"] == null || Session["UsuarioSAP"] == null)
            //{
            //    Response.Redirect("Login.aspx");
            //}
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                string numeroPedido = "";
                if (Request.QueryString["np"] != null)
                {
                    numeroPedido = Request.QueryString["np"].ToString();
                }

                if (!numeroPedido.Equals(""))
                {
                    PedidoBE objPedido;
                    if (Session["PedidoImpr"] == null)
                    {
                        objPedido = PedidoBC.Instance.leer(numeroPedido);
                    }
                    else
                    {
                        objPedido = (PedidoBE)Session["PedidoImpr"];
                    }
                    
                    if (objPedido != null)
                    {
                        //rgutierrez 16.11.2011 Se quita la validacion para que tambien permita imprimir Pedidos
                        //// Si no es oferta, mostrar mensaje de error...
                        //if (!ParametroBC.Instance.esTipoOferta(objPedido.CodTipoDoc) || (objPedido.CodTipoDoc.Equals("Z004")))
                        //{
                        //    throw new Exception("Tipo de documento " + objPedido.CodTipoDoc + " no válido para el mensaje seleccionado.");
                        //}

                        string pDireccion = "", pTelefono = "", pFax = "", pAtencion = "";
                        PedidoBC.Instance.buscaDatosImpresion(numeroPedido, out pDireccion, out pTelefono, out pFax, out pAtencion);

                        //sociedad Decor Center 
                        string[] words = pTelefono.Split('%');
                        pTelefono = words[0];
                        lblSociedad.Text = "DECOR CENTER";
                        lblSociedadtxt.Text = words[1];
                        //------------------------------------------
                        
                        
                        lblDireccionLogo.Text = pDireccion;
                        lblTelefonosLogo.Text = pTelefono + (pFax == "" ? "" : ", " + pFax);
                        lblAtt.Text = pAtencion;

                        InterlocutorBE objSolicitanteVende = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocVendedor1")); });
                        GenericBE objCondPago = CondicionPagoBC.Instance.leer(objPedido.CondPago);
                        if (objCondPago != null)
                        {
                            lblCondpago.Text = objCondPago.Descripcion.Replace("::", "");
                        }

                        if (objSolicitanteVende.Persona != null)
                        {
                            PersonaBE objVendedor = PersonaBC.Instance.leer(objSolicitanteVende.Persona.CodPersona);
                            if (objVendedor != null) { lblVendedor.Text = objVendedor.Descripcion; }
                        }
                        lblFecha.Text = objPedido.Fecha.ToShortDateString();


                        //-- validar si es un cliente eventual:
                        ClienteBE objCliente = ClienteBC.Instance.leer(objPedido.CodCliente);
                        if (objCliente.Eventual)//si es eventual
                        {
                            InterlocutorBE objSolicitante = objPedido.Interlocutores.Find(delegate(InterlocutorBE ilctr) { return (ilctr.Funcion == ParametroBC.Instance.getParamValue("IlocCliente")); });
                            if (objSolicitante != null && objSolicitante.Cliente != null)
                            {
                                lblCliente.Text = objSolicitante.Cliente.Descripcion.ToString();
                                lblDirecc.Text = objSolicitante.Cliente.Direccion.ToString();
                                lblRuc.Text = objSolicitante.Cliente.Ruc.ToString();
                                lblTelef.Text = objSolicitante.Cliente.Telefono.ToString();
                            }
                        }
                        else
                        {
                            //ClienteBE objCliente = ClienteBC.Instance.leer(objPedido.CodCliente, numeroPedido);
                            lblCliente.Text = objCliente.Descripcion;
                            lblDirecc.Text = objCliente.DireccionCompleta;
                            lblRuc.Text = objCliente.Ruc;
                            lblTelef.Text = objCliente.Telefono;
                        }

                        if (ParametroBC.Instance.esTipoOferta( objPedido.CodTipoDoc ))
                        {
                            lblCoti.Text = "COTIZACIÓN N° ";
                        }
                        else
                        {
                            lblCoti.Text = "N° PEDIDO VENTA ";
                        }

                        lblCotiza.Text = objPedido.NumPedido;

                        //lblValor.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.SubTotal);
                        //lblIgv.Text = string.Format("{0:n2}", objPedido.Igv);
                        //lblTotal.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.Total);

                        lblValor.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.SubtotalImp);
                        lblIgv.Text = string.Format("{0:n2}", objPedido.Igv);
                        lblPercep.Text = string.Format("{0:n2}", objPedido.Percepcion);
                        lblTotal.Text = ParametroBC.Instance.getParamValue(objPedido.Moneda) + " " + string.Format("{0:n2}", objPedido.TotalImp + objPedido.Percepcion);

                        //si es un pedido de transporte cambia cantidad x pesoneto
                        //if (objPedido.CodTipoDoc.Equals(ParametroBC.Instance.getParamValue("CodTransporte")))
                        //{
                        //    foreach (DetalleBE objDetalle in objPedido.Detalle)
                        //    {
                        //        //objDetalle.Peso = objDetalle.Cantidad;
                        //        //objDetalle.Cantidad = 1m;
                        //    }
                        //}

                        //--- quitar componentes de la oferta
                        objPedido.Detalle.RemoveAll(X => X.TipoPosicion == "Z017");
                        objPedido.Detalle.RemoveAll(X => X.TipoPosicion == "Z012");

                        var xys = from order in objPedido.Detalle
                                 orderby order.CodGrupoMat, order.Posicion
                                 group order by new { order.CodGrupoMat };


                        List<DetalleBE> lstAuxiliar = objPedido.Detalle;
                        //--- ordenar
                        lstAuxiliar.Sort(
                            delegate(DetalleBE a, DetalleBE b)
                            {
                                int aux = 0;
                                try { aux = Convert.ToInt32(a.CodGrupoMat) - Convert.ToInt32(b.CodGrupoMat); }
                                catch //(Exception ex) 
                                { }
                                if (aux == 0)
                                {
                                    try { aux = Convert.ToInt32(a.Posicion) - Convert.ToInt32(b.Posicion); }
                                    catch //(Exception ex) 
                                    { }
                                }
                                return aux;
                            }
                        );

                        //string str = "";
                        List<PedidoImprBE> lstPedidoImpr = new List<PedidoImprBE>();
                        foreach (var xy in xys)
                        {
                            PedidoImprBE objPedidoImprBE = new PedidoImprBE();

                            objPedidoImprBE.CodGrupo = xy.Key.CodGrupoMat;
                            GenericBE grpMaterial = MaterialBC.Instance.leerGruposMat(xy.Key.CodGrupoMat);
                            if (grpMaterial != null && grpMaterial.Descripcion != null)
                            {
                                objPedidoImprBE.DescGrupo = grpMaterial.Descripcion;
                            }
                            else
                            {
                                objPedidoImprBE.DescGrupo = "No Agrupado";
                            }
                            objPedidoImprBE.TotalGrupo = xy.Sum(item => item.Total);
                            objPedidoImprBE.TotalSinIGVGrupo = xy.Sum(item => item.PrecioSinIGV);
                            objPedidoImprBE.TotalConIGVGrupo = xy.Sum(item => item.PrecioConIGV);

                            lstPedidoImpr.Add(objPedidoImprBE);
                        }

                        foreach (PedidoImprBE item in lstPedidoImpr)
                        {
                            item.Detalle = lstAuxiliar.FindAll(X => X.CodGrupoMat == item.CodGrupo);
                        }

                        //var sums = objPedido.Detalle.GroupBy(X => new { X.CodGrupo }).Select(Y => Y.Sum(X => X.Total));
                        //Response.Write(str);
                        //GdvLista.DataSource = lstAuxiliar;
                        //GdvLista.DataBind();

                        dlDetalle.DataSource = lstPedidoImpr;
                        dlDetalle.DataBind();

                        //rgutierrez 27.01.2012
                        List<GlosaBE> glosas = PedidoBC.Instance.glosasCotizacion(objPedido.NumPedido);
                        GdvGlosa.DataSource = glosas;
                        GdvGlosa.DataBind();
                    }
                    else
                    {
                        throw new Exception("No se encontró el doc. de ventas.");
                    }
                }
                else
                {
                    throw new Exception("No se especificó el doc. de ventas.");
                }
            }
            catch (Exception ex)
            {
                Response.Write("<h4>No se puede mostrar la información.<br />Error: " + ex.Message + "</h4>");
                Page.Visible = false;
            }
        }

        protected void dlDetalleItem_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Label lblCodMaterial = (Label)e.Item.FindControl("lblCodMaterial");
                if (lblCodMaterial != null)
                {
                    if (lblCodMaterial.Text.Equals("0"))
                    {
                        //e.Item.ItemType = ListItemType.;
                    }
                }
            }
        }

        //private void CrearDt()
        //{
        //    DataTable dt = new DataTable("lista");
        //    dt.Columns.Add("Item", lstDetalle[0].Cantidad.GetType());
        //    dt.Columns.Add("Codigo", lstDetalle[0].CodMaterial.GetType());
        //    dt.Columns.Add("Unid", lstDetalle[0].CodUMedida.GetType());
        //    dt.Columns.Add("Cant", lstDetalle[0].Cantidad.GetType());
        //    dt.Columns.Add("Descripcion", lstDetalle[0].DescMaterial.GetType());
        //    dt.Columns.Add("P.Neto", lstDetalle[0].Peso.GetType());
        //    dt.Columns.Add("Total", lstDetalle[0].SubTotal.GetType());
        //    dt.Columns.Add("Alm", lstDetalle[0].CodAlmacen.GetType());
        //    foreach (DetalleBE item in lstDetalle)
        //    {
        //        dt.Rows.Add(
        //            item.Cantidad,
        //            item.CodMaterial,
        //            item.CodUMedida,
        //            item.Cantidad,
        //            item.DescMaterial,
        //            item.PesoNeto,
        //            item.SubTotal,
        //            item.CodAlmacen);
        //    }
        //    GdvLista.DataSource = dt;
        //    GdvLista.DataBind();
        //}
    }

}

